package com.hb.test

import com.hb.A_基础.function.add
import java.security.Timestamp
import java.util.concurrent.TimeUnit

fun getAddressFromDB(userId:Long):Address{
    //获取地址详情
    //模拟I/O操作
    println("userId : $userId getAddressFromDB ")
    Thread.sleep(1000)
    return Address(userId,"杭州")
}

fun getGoodsFromDB(goodsId:Long):Goods{
    //获取地址详情
    //模拟I/O操作
    println("goodsId : $goodsId getGoodsFromDB ")
    Thread.sleep(1000)
    return Goods(goodsId,"好吃的食物",10)
}

fun doOrder(goods: Goods,address: Address):Long{
    //下单操作
    println("goods : $goods address $address ")
    Thread.sleep(1000)
    return 1L
}

/**
 * 缺点：
 *  它是一种同步阻塞的方式。更好的解决方法是：获取商品的信息，获取地址这两个没有关联的操作设计成并行执行，
 *  这样就可以拥有更快的响应速度，假设我们每次IO操作耗时是100ms，那么上面的这段代码的执行时间起码是300ms
 *  其实理论上可以将时间控制在200ms左右。
 */
fun order(goodsId:Long,userId: Long){
    val goods= getGoodsFromDB(goodsId)
    val address= getAddressFromDB(userId)
    doOrder(goods,address)
}

fun main() {
    val start = System.currentTimeMillis()
    order(1L,2L)
    val end = System.currentTimeMillis()
    val toSeconds = TimeUnit.MILLISECONDS.toSeconds(end - start)
    println("耗时： $toSeconds s")
}